<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js中的变量</title>
</head>
<body>
    <script type="text/javascript">
        // 强类型语言: 变量在编译阶段已经确定是什么类型了
        // js是一种弱类型语言, 没有编译阶段, 一个变量可以随意赋值, 赋什么值都行
        // 如何声明变量?
        // var 变量名;
        // 怎么给变量赋值?
        // 变量名 = 值;
        // 一个变量可以随意赋值
        // var i = 100;
        // i = false;
        // i = "abc";
        // i = 3.14;
        // i = new Object();

        // 如果一个变量没有赋值会默认赋值为 undefined
        var i;
        alert("i = " + i);
        // 一个变量可以默认赋值为 undefined
        var k = undefined;

        // 一个变量没有赋值直接访问会出现什么问题
        // 会有语法错误 age is not defined, 不能这样写
        // 错误之后就不在执行
        // alert(age);

        var a, b, c = 200;
        alert(a);// undefined
        alert(b);// undefined
        alert(c);// 200



        // 局部变量和全局变量
        // 全局变量: 在函数体之外声明的变量, 声明周期为浏览器从打开到关闭
        // 打开时声明, 关闭时销毁, 尽量少用, 因为耗费内存空间
        // 局部变量: 在函数体内部声明的变量, 包括函数的形参
        // 声明周期为函数运行时候开辟, 结束时候内存空间释放
        var i = 100;
        function accessI() {
            // 这里访问的是全局变量
            alert(i);
        }
        accessI();

        var username = "jack";// 全局变量
        function accessUsername() {
            var username = "Tom";// 局部变量
            alert(username);
        }

        accessUsername();// Tom
        alert(username);// Jack

        // 在局部变量的作用域之外访问会出错
        // accessAge = function () {
        //     var age = 22;
        //     alert(age);
        // }
        // alert(age); //  age is not defined


        // 以下语法是很奇怪的
        function myFun() {
            // 当一个变量在声明时, 没有使用 var 关键字修饰,
            // 那么这个变量不管在哪都是 全局变量
            myName = "张三";
        }
        // 但是定义在函数中的这种不加 var 的全局变量, 必须要执行函数才能在外部访问
        // 否则内存中不会加载这个变量的信息, 也就不会存在该变量
        myFun();
        alert(myName);

    </script>
</body>
</html>